package cn.iocoder.yudao.framework.business.basic.service;

import cn.hutool.core.collection.CollUtil;
import cn.hutool.core.map.MapUtil;
import cn.iocoder.yudao.framework.common.util.collection.CollectionUtils;
import jakarta.annotation.Nullable;

import java.util.Collection;
import java.util.List;
import java.util.Map;
import java.util.function.Function;

/**
 * <pre>
 * OOoO0OOoO0OOOooo0oOOOO0OOOOO0oooOO0ooOOO0Ooooo0OOOOo0ooooO0OOooo0Ooooo0OOOOO
 *  服务接口
 * OOoO0OOoO0OOOooo0oOOOO0OOOOO0oooOO0ooOOO0Ooooo0OOOOo0ooooO0OOooo0Ooooo0OOOOO
 * </pre>
 *
 * @author 山野羡民（1032694760@qq.com）
 * @since 2024/11/29
 */
public interface ListService<VO, DTO> {

    /**
     * 列表
     *
     * @param ids 编号集合
     * @return 列表信息
     */
    default List<VO> getList(Collection<Long> ids) {
        return getList(ids, null);
    }

    /**
     * 列表
     *
     * @param ids 编号集合
     * @param userId 用户编号
     * @return 列表信息
     */
    List<VO> getList(Collection<Long> ids, @Nullable Long userId);

    /**
     * 键值
     *
     * @param ids 编号集合
     * @param keyFunc 如`RESP::getId`
     * @return 键值对
     */
    default Map<Long, VO> getMap(Collection<Long> ids, Function<VO, Long> keyFunc) {
        return getMap(ids, keyFunc, null);
    }

    /**
     * 键值
     *
     * @param ids 编号集合
     * @param keyFunc 如`RESP::getId`
     * @param userId 用户编号
     * @return 键值对
     */
    default Map<Long, VO> getMap(Collection<Long> ids, Function<VO, Long> keyFunc, @Nullable Long userId) {
        List<VO> list = getList(ids, userId);
        if (CollUtil.isEmpty(ids)) {
            return MapUtil.newHashMap();
        }
        return CollectionUtils.convertMap(list, keyFunc);
    }

    /**
     * 列表
     *
     * @param param 查询条件
     * @return 列表信息
     */
    default List<VO> getList(DTO param) {
        return getList(param, null, null);
    }


    /**
     * 列表
     *
     * @param param 查询条件
     * @param limit 限制条数
     * @return 列表信息
     */
    default List<VO> getList(DTO param, Integer limit) {
        return getList(param, limit, null);
    }

    /**
     * 列表
     *
     * @param param 查询条件
     * @param limit 限制条数
     * @param userId 用户编号
     * @return 列表信息
     */
    List<VO> getList(DTO param, Integer limit, @Nullable Long userId);

}
